package com.whl215.kit.adapter

import android.view.LayoutInflater
import android.view.ViewGroup
import com.whl215.kit.adapter.wrap.GrapeItemWrapper

/**
 * author： happiness
 * date： 2021/2/22
 * description：多类型adapter . 实现多类型的关键在于 HLItemWrapper 数据包装类 区别与其他框架的概念
 * 并不是Data 与 ItemProvider 对应关系. HLItemWrapper 即是Data 又是ItemProvider 存在的.
 * 数据角度 Adapter 中list 存储的数据泛型是 HLItemWrapper. 为Adapter设置数据需要添加 HLItemWrapper 的子类
 * HLItemWrapper内部的item属性 作为真实数据类型的存在.
 * itemProvider的角度 提供 onBindViewHolder() 数据与view绑定
 * getViewType()  方法返回 R.layout.XXX  布局资源id . 将id当作区分类型的存在.
 * 创建viewHolder时 不需要判断viewType 再去创建 不同的viewHolder
 *
 *  当一个recyclerView需要展示多种布局 根据数据类型 创建HLItemWrapper的子类
 *  IntItemWrapper
 *  StudentItemWrapper
 *  TeacherItemWrapper
 *  String1ItemWrapper
 *  String2ItemWrapper
 *  同一种数据类型 也可以方便的 在同一个Adapter里展示多种view
 */
open class GrapeBaseMultiAdapter<T : GrapeItemWrapper> : GrapeBaseAdapter<T>() {

    override fun buildViewHolder(parent: ViewGroup, viewType: Int): GrapeViewHolder {
        return GrapeViewHolder(
            LayoutInflater.from(parent.context)
                .inflate(viewType, parent, false)
        )
    }

    override fun convert(holder: GrapeViewHolder, position: Int, item: T) {
        val itemWrapper: GrapeItemWrapper = mList[position]
        itemWrapper.onBindViewHolder(holder, position)
    }


    override fun getItemViewType(position: Int): Int {
        var itemViewType = super.getItemViewType(position)
        if (itemViewType == VIEW_TYPE_CONTENT) {
            itemViewType = mList[position].getViewType()
        }
        return itemViewType
    }


}